home *** CD-ROM | disk | FTP | other *** search
/ Aminet 49 / Aminet 49 (2002)(GTI - Schatztruhe)[!][Jun 2002].iso / Aminet / dev / src / earth.lha / Earth / Earth.c < prev    next >
C/C++ Source or Header  |  2002-03-25  |  4KB  |  176 lines

  1. /*  Earth.c
  2.  *  A little bit different "Hello, World!" program ;-)
  3.  *  Author: Norman Walter
  4.  *  e-mail: walternn@studi.informatik.uni-stuttgart.de
  5.  *  www: http://www.norman-interactive.com
  6.  *  Date: 22.3.2002
  7.  */
  8.  
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <math.h>
  13. #include <GL/glut.h>
  14.  
  15. /* SGI rgb texture loading routines by Brian Paul */
  16. #ifndef AMIGA
  17. #include "../util/readtex.c"   /* I know, this is a hack. */
  18. #else
  19. GLboolean LoadRGBMipmaps( const char *, GLint );
  20. #endif
  21.  
  22. #define ANIMATE 10
  23. #define POINT_FILTER 20
  24. #define LINEAR_FILTER 21
  25. #define QUIT 100
  26.  
  27. static GLuint Globe;
  28.  
  29. static GLboolean Animate = GL_TRUE;
  30.  
  31. static GLfloat Xrot = -66.55, Yrot = -23.45, Zrot = 0.0;
  32. static DZrot = 1.0;
  33.  
  34.  
  35. static void Idle( void )
  36. {
  37.    if (Animate) {
  38.      Zrot += DZrot;
  39.       if (Zrot > 360.0)
  40.         {
  41.             Zrot -= 360.0;
  42.         }
  43.       glutPostRedisplay();
  44.    }
  45. }
  46.  
  47.  
  48. static void Display( void )
  49. {
  50.    glClear( GL_COLOR_BUFFER_BIT | GLUT_DEPTH );
  51.  
  52.    glPushMatrix();
  53.  
  54.    glRotatef(Xrot, 1.0, 0.0, 0.0);
  55.    glRotatef(Yrot, 0.0, 1.0, 0.0);
  56.    glRotatef(Zrot, 0.0, 0.0, 1.0);
  57.    glScalef(5.0, 5.0, 5.0);
  58.  
  59.    glCallList(Globe);
  60.  
  61.    glPopMatrix();
  62.  
  63.    glutSwapBuffers();
  64. }
  65.  
  66.  
  67. static void Reshape( int width, int height )
  68. {
  69.    glViewport( 0, 0, width, height );
  70.    glMatrixMode( GL_PROJECTION );
  71.    glLoadIdentity();
  72.    glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
  73.    glMatrixMode( GL_MODELVIEW );
  74.    glLoadIdentity();
  75.    glTranslatef( 0.0, 0.0, -70.0 );
  76. }
  77.  
  78.  
  79. static void ModeMenu(int entry)
  80. {
  81.    if (entry==ANIMATE) {
  82.       Animate = !Animate;
  83.    }
  84.    else if (entry==POINT_FILTER) {
  85.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  86.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  87.    }
  88.    else if (entry==LINEAR_FILTER) {
  89.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  90.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  91.    }
  92.    else if (entry==QUIT) {
  93.       exit(0);
  94.    }
  95.    glutPostRedisplay();
  96. }
  97.  
  98.  
  99. static void Key( unsigned char key, int x, int y )
  100. {
  101.    switch (key) {
  102.       case 27:
  103.      exit(0);
  104.      break;
  105.    }
  106.    glutPostRedisplay();
  107. }
  108.  
  109.  
  110. static void Init( void )
  111. {
  112.  
  113.    GLUquadricObj *q = gluNewQuadric();
  114.    Globe = glGenLists(1);
  115.  
  116.    glNewList(Globe, GL_COMPILE);
  117.  
  118.      /* globe */
  119.      gluQuadricNormals(q, GL_SMOOTH);
  120.      gluQuadricTexture(q, GL_TRUE);
  121.  
  122.      gluSphere (q, 1.0, 15, 15);
  123.  
  124.    glEndList();
  125.  
  126.    gluDeleteQuadric(q);
  127.  
  128.    /* fitering = nearest, initially */
  129.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  130.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  131.  
  132.    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  133.    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  134.  
  135.    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  136.    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  137.  
  138.    if (!LoadRGBMipmaps("earth_small.rgb", GL_RGB)) {
  139.       printf("Error: couldn't load texture image\n");
  140.       exit(1);
  141.    }
  142.  
  143.    glEnable(GL_CULL_FACE);
  144.  
  145.    glEnable(GL_TEXTURE_2D);
  146.  
  147. }
  148.  
  149.  
  150. int main( int argc, char *argv[] )
  151. {
  152.    glutInit( &argc, argv );
  153.    glutInitWindowSize( 200, 200 );
  154.  
  155.    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  156.  
  157.    glutCreateWindow(argv[0] );
  158.  
  159.    Init();
  160.  
  161.    glutReshapeFunc( Reshape );
  162.    glutKeyboardFunc( Key );
  163.    glutDisplayFunc( Display );
  164.    glutIdleFunc( Idle );
  165.  
  166.    glutCreateMenu(ModeMenu);
  167.    glutAddMenuEntry("Point Filtered", POINT_FILTER);
  168.    glutAddMenuEntry("Linear Filtered", LINEAR_FILTER);
  169.    glutAddMenuEntry("Toggle Animation", ANIMATE);
  170.    glutAddMenuEntry("Quit", QUIT);
  171.    glutAttachMenu(GLUT_RIGHT_BUTTON);
  172.  
  173.    glutMainLoop();
  174.    return 0;
  175. }
  176.